package com.genericity.demo07;

import java.util.ArrayList;

public class Test {
    public static void main(String[] args) {
        System.out.println("类型通配符号的上限测试使用");

        ArrayList<Animal> animal = new ArrayList<>();
        ArrayList<Cat> cat = new ArrayList<>();
        ArrayList<MiniCat> miniCat = new ArrayList<>();
        // 调用方法测试
        //showAnimal(animal); --  报错，因为上限为 Cat类，Animal类是Cat父类 固然不行
        showAnimal(cat);
        showAnimal(miniCat);

        /**
         * ArrayList 类里面也存在上限方法
         * addAll()
         * addAll(Collection<? extends Cat> c) 表示传递
         * 进来数据类型集合 只能是Cat或Cat的子类类型
         */
        cat.addAll(miniCat);
        cat.addAll(cat);

        /**
         * 调用下限操作
         */

        showDown(animal);
        showDown(cat);
        //showDown(miniCat); 报错 因为只能添加属于 Cat的父类 或者 Cat 类，不能传子类
    }

    /**
     * 类型通配符上限，传递的集合类型，只能是Cat或Cat的子类类型
     * @param list 传入泛型集合
     */
    public static void showAnimal(ArrayList<? extends Cat> list) {
        /**
         * 无法添加元素
         * 因为不知道具体传递的数据类型，比如 我传入是 MiniCat
         * 那就没有办法填充Cat类型
         */
        // list.add(new Animal());
        // list.add(new Cat());
        // list.add(new MiniCat());
        for (int i = 0; i < list.size(); i++) {
            // 获取每一个对象
            Cat cat = list.get(i);
            System.out.println(cat);
        }
    }

    /**
     * 类型通配符下限，要求集合只能是Cat或Cat的父类类型
     * @param list
     */
    public static void showDown(ArrayList<? super Cat> list) {
        for (Object o : list) {
            System.out.println(o);
        }
    }
}
